home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************/
- /* */
- /* Source - Debugger.c */
- /* Author - Alexander S. Colwell, Copyright (C) 1988, 1989 */
- /* */
- /* Purpose - This is the "Debugger" desk accessory interface */
- /* routines. */
- /* */
- /* Routine - DbgGetRefHdl: Setup debugging enviroment. */
- /* DbgPrint : Do debugging print output. */
- /* DbgBufPrint : Do debugging buffer print output. */
- /* DbgDump : Do debugging dump output. */
- /* DbgBufDump : Do debugging buffer dump output. */
- /* DbgArgCnt : Count # of arguments on the stack. */
- /* DbgStrLen : Do string length. */
- /* */
- /* Revisions - None. */
- /* */
- /********************************************************************/
-
- #include "Debugger.h" /* Debugger defs */
-
- /* Device control entry function*/
- #define DbgDCtlEntry(refNbr) (UTableBase[-1*(refNbr + 1)])
-
- short DbgArgCnt(); /* Define forward references */
-
- DBGHDL DbgGetRefHdl()
-
- {
-
- register DBGHDL dbgHdl; /* DA's reference # handle */
-
- asm { /* Debugger's resource name */
-
- CLR.L -(sp) ;Allocate return handle
- PEA debuggerType;Load resource type
- PEA @dbgRef ;Load resource name
- _GetNamedResource ;Get resource handle
- MOVE.L (sp)+,dbgHdl;Save resource handle
- BRA.S @dbgExit ;Skip around the resource name
-
- dbgRef: DC.B 18,'D','e','b','u','g','g','e','r',' ','R','e','f','e','r','e','n','c','e'
-
- dbgExit:
-
- }
-
- return(dbgHdl); /* Return resource handle */
-
- }
-
- void DbgPrint(dbgHdl,args)
-
- register DBGHDL dbgHdl; /* Working DA's ref # handle */
- char *args; /* Input arguments */
-
- {
-
- register short refNbr; /* Working DA's reference # */
- register short daEnable; /* Working save DA's enable state*/
- register DCtlHandle dceHdl; /* Working device control entry */
-
- if (dbgHdl) { /* Check if got the handle */
-
- if (refNbr = (*dbgHdl)->daRefNbr) {/* Check if it's valid*/
-
- /* Check if got device ctrl hdl */
- if (dceHdl = GetDCtlEntry(refNbr)) {
-
- /* Save enabled stated */
- daEnable = (*dceHdl)->dCtlFlags & dCtlEnable;
-
- /* Enable DA's entry */
- (*dceHdl)->dCtlFlags |= dCtlEnable;
-
- Control(refNbr,accDbgPrint,&args);/* Write it */
-
- if (!daEnable) /* Check if was not enabled */
- (*dceHdl)->dCtlFlags &= ~dCtlEnable;
-
- }
-
- }
-
- }
-
- }
-
- void DbgBufPrint(args)
-
- long *args; /* Input arguments */
-
- {
-
- register DBGHDL dbgHdl; /* Working DA's ref # handle */
- register DBGPTR dbgPtr; /* Working DA's ref handle */
- DCtlHandle dceHdl; /* Working device control entry */
- register char *fmt; /* Working format string */
- register char *buf; /* Working buffer address */
- long *addr; /* Working stack address */
- register long fLen; /* Working format string length */
- register long dLen; /* Working data buffer length */
- register long argc; /* Working # of argument bytes */
- register long nextIdx; /* Working next table index */
- register long dataIdx; /* Working data index */
-
- dbgHdl = (DBGHDL)(&args[0]);/* Set debugger handle */
-
- if (dbgHdl) { /* Check if got the handle */
-
- dbgPtr = *dbgHdl; /* Setup debugger pointer */
-
- if (dbgPtr->daRefNbr) { /* Check if it's valid */
-
- /* Check if got device ctrl hdl */
- if (dceHdl = DbgDCtlEntry(dbgPtr->daRefNbr)) {
-
- /* Check if have working buffers*/
- if (dbgPtr->bufTable && dbgPtr->bufData) {
-
- /* Set next table index entry */
- nextIdx = (dbgPtr->bufNextIdx + 1L) %
- dbgPtr->bufTableSize;
-
- /* Check if table over flow */
- if (nextIdx == dbgPtr->bufTableIdx)
- dbgPtr->bufError = dbgTableOvrFlw;
-
- else { /* Nope, continue */
-
- /* Get # of arguments */
- argc = DbgArgCnt(&args) - 4L;
-
- /* Check if has format string */
- if (argc >= 4L) {
-
- /* Set stack address */
- addr = (long *)(&args);
-
- /* Get variable argument */
- fmt = (char *)(addr[1]);
-
- /* Get format string length */
- fLen = DbgStrLen(fmt) + 1L;
-
- /* Check if it's even # of chars*/
- if (fLen & 0x1L)
- fLen += 1L;/* Align it */
-
- /* Computer total buffer length */
- dLen = argc + fLen + 2L;
-
- /* Check if time to buffer wrap */
- if ((dataIdx = dbgPtr->bufDataIdx) + dLen >=
- dbgPtr->bufDataSize) {
-
- /* Reset to beginning-of-buffer */
- dataIdx = 0L;
-
- }
-
- /* Check if buffer is to big */
- if (dLen > dbgPtr->bufDataSize)
- dbgPtr->bufError = dbgBufOvrFlw;
-
- /* Check if there anything in buffer*/
- else if (dbgPtr->bufTableIdx !=
- dbgPtr->bufNextIdx) {
-
- /* Check if data buffer overflow*/
- if (dataIdx <
- (*dbgPtr->bufTable)[dbgPtr->bufTableIdx + 1L])
- if (dLen + dataIdx >
- (*dbgPtr->bufTable)[dbgPtr->bufTableIdx + 1L])
- dbgPtr->bufError = dbgDataOvrFlw;
-
- }
-
- /* Check if there is no overflow*/
- if (!dbgPtr->bufError) {
-
- /* Set next output line */
- dbgPtr->bufNextIdx = nextIdx;
-
- /* Save data buffer index */
- (*dbgPtr->bufTable)[nextIdx] =
- dataIdx;
-
- /* Set buffer address */
- buf = &(*dbgPtr->bufData)[dataIdx];
-
- *buf = accDbgPrint;/* Set code */
-
- /* Copy the string format */
- BlockMove(fmt,buf + 2L,fLen);
-
- /* Copy the stack */
- BlockMove(&addr[1],buf + fLen + 2L,argc);
-
- /* Bump to next position */
- dbgPtr->bufDataIdx = dataIdx + dLen;
-
- /* Enable DA's entry */
- (*dceHdl)->dCtlFlags |= dNeedTime;
-
- /* Reset delay timer */
- (*dceHdl)->dCtlDelay = 1;
-
- }
-
- }
-
- }
-
- }
-
- }
-
- }
-
- }
-
- }
-
- void DbgDump(dbgHdl,buffer,size)
-
- register DBGHDL dbgHdl; /* Working DA's ref # handle */
- char *buffer; /* Input buffer */
- long size; /* Input buffer size */
-
- {
-
- register short refNbr; /* Working DA's reference # */
- register short daEnable; /* Working save DA's enable state*/
- register DCtlHandle dceHdl; /* Working device control entry */
- long csParam[2]; /* Working control param list */
-
- if (dbgHdl) { /* Check if got the handle */
-
- if (refNbr = (*dbgHdl)->daRefNbr) {/* Check if it's valid*/
-
- /* Check if got device ctrl hdl */
- if (dceHdl = GetDCtlEntry(refNbr)) {
-
- /* Save enabled stated */
- daEnable = (*dceHdl)->dCtlFlags & dCtlEnable;
-
- /* Enable DA's entry */
- (*dceHdl)->dCtlFlags |= dCtlEnable;
-
- csParam[0] = (long)(buffer);/* Init the param list*/
- csParam[1] = size;
-
- /* OK, let's dump it now */
- Control(refNbr,accDbgDump,csParam);
-
- if (!daEnable) /* Check if was not enabled */
- (*dceHdl)->dCtlFlags &= ~dCtlEnable;
-
- }
-
- }
-
- }
-
- }
-
- void DbgBufDump(dbgHdl,buffer,size)
-
- register DBGHDL dbgHdl; /* Working DA's ref # handle */
- char *buffer; /* Input buffer */
- long size; /* Input buffer size */
-
- {
-
- register DBGPTR dbgPtr; /* Working DA's ref handle */
- DCtlHandle dceHdl; /* Working device control entry */
- register char *buf; /* Working buffer address */
- register long dLen; /* Working data buffer length */
- register long argc; /* Working # of argument bytes */
- register long nextIdx; /* Working next table index */
- register long dataIdx; /* Working data index */
-
- if (dbgHdl) { /* Check if got the handle */
-
- dbgPtr = *dbgHdl; /* Setup debugger pointer */
-
- if (dbgPtr->daRefNbr) {/* Check if it's valid */
-
- /* Check if got device ctrl hdl */
- if (dceHdl = DbgDCtlEntry(dbgPtr->daRefNbr)) {
-
- /* Check if have working buffers*/
- if (dbgPtr->bufTable && dbgPtr->bufData) {
-
- /* Set next table index entry */
- nextIdx = (dbgPtr->bufNextIdx + 1L) %
- dbgPtr->bufTableSize;
-
- /* Check if table over flow */
- if (nextIdx == dbgPtr->bufTableIdx)
- dbgPtr->bufError = dbgTableOvrFlw;
-
- else { /* Nope, continue */
-
- /* Computer total buffer length */
- dLen = size + sizeof(size) + 2L;
-
- if (dLen & 0x1L)/* Check if odd size */
- dLen += 1L;/* Let's make it even */
-
- /* Check if time to buffer wrap */
- if ((dataIdx = dbgPtr->bufDataIdx) + dLen >=
- dbgPtr->bufDataSize) {
-
- /* Reset to beginning-of-buffer */
- dataIdx = 0L;
-
- }
-
- /* Check if buffer is to big */
- if (dLen > dbgPtr->bufDataSize)
- dbgPtr->bufError = dbgBufOvrFlw;
-
- /* Check if there anything in buffer*/
- else if (dbgPtr->bufTableIdx !=
- dbgPtr->bufNextIdx) {
-
- /* Check if data buffer overflow*/
- if (dataIdx <
- (*dbgPtr->bufTable)[dbgPtr->bufTableIdx + 1L])
- if (dLen + dataIdx >
- (*dbgPtr->bufTable)[dbgPtr->bufTableIdx + 1L])
- dbgPtr->bufError = dbgDataOvrFlw;
-
- }
-
- /* Check if there is no overflow*/
- if (!dbgPtr->bufError) {
-
- /* Set next output line */
- dbgPtr->bufNextIdx = nextIdx;
-
- /* Save data buffer index */
- (*dbgPtr->bufTable)[nextIdx] =
- dataIdx;
-
- /* Set buffer address */
- buf = &(*dbgPtr->bufData)[dataIdx];
-
- *buf = accDbgDump;/* Set code */
-
- /* Copy the size of the buffer */
- BlockMove(&size,buf + 2L,
- (long)(sizeof(size)));
-
- /* Copy the buffer */
- BlockMove(buffer,
- buf + sizeof(size) + 2L,size);
-
- /* Bump to next position */
- dbgPtr->bufDataIdx = dataIdx + dLen;
-
- /* Enable DA's entry */
- (*dceHdl)->dCtlFlags |= dNeedTime;
-
- /* Reset delay timer */
- (*dceHdl)->dCtlDelay = 1;
-
- }
-
- }
-
- }
-
- }
-
- }
-
- }
-
- }
-
- short DbgArgCnt(vararg)
-
- long vararg; /* Variable argument list */
-
- {
-
- register union { /* Union of three variable types*/
- long addr; /* Address of the types */
- long **args;
- } varg; /* Working variable argument list*/
- register unsigned long instr; /* Working instruction */
- register long arg; /* Working argument */
- register long count = 0L; /* # of arguments */
-
- varg.addr = vararg; /* Init variable argument list */
-
- varg.addr -= 4; /* Position to the instruction */
-
- instr = **varg.args & 0xffff0000;/* Set instruction word */
-
- if (instr == 0x4fef0000) /* Check if ADD instruction */
- count = (**varg.args & 0x0000ffff );/* Set # of bytes */
-
- /* Check if ADDI instruction */
- else if ((instr & 0xf1ff0000) == 0x508f0000) {
-
- /* Check if zero, then 8 bytes */
- if (!(count = ((instr & 0x0e000000) >> 25)))
- count = 8; /* Reset to eight bytes on stack*/
-
- }
-
- return(count); /* Return count */
-
- }
-
- long DbgStrLen(s)
-
- register char *s; /* String pointer */
-
- {
-
- register long sLen = 0; /* String length */
-
- while(*s++) /* Continue till end-of-string */
- sLen++; /* Bump string length */
-
- return(sLen); /* Return string length */
-
- }
-
-